#include "celda.h"

celda::celda(){

	_fija = false;
	_valor = 0;
	_opciones.clear();
	
}

celda::~celda(){
}

bool celda::fijar_valor(const unsigned int &dato, const bool &fija){

	if (_fija == false){
		_valor = dato;
		_fija = fija;
		return true;
	}
	else
		return false;
}

void celda::borrar_valor(){

	_valor = 0;
	_fija = false;
	
}

unsigned int celda::valor() const {

	return _valor;

}

bool celda::valida() const{
	
	if ( _valor != 0 )
		return true;
	else
		return false;
		
}

bool celda::fija() const{
	
	if (_fija == true)
		return true;
    else
		return false;	
}

bool celda::nueva_opcion(const unsigned int &dato){
	
	set<unsigned int>::iterator pos;
	
	for(pos = _opciones.begin();pos != _opciones.end(); ++pos)
		if (*pos == dato)
			return false;
			
	_opciones.insert(dato);
	return true;


}

bool celda::borrar_opcion(const unsigned int &dato){
	
	set<unsigned int>::iterator pos;
	
	for(pos = _opciones.begin();pos != _opciones.end(); ++pos)
		if (*pos == dato){
			_opciones.erase(dato);
			return true;
		}
			
	return false;
}

const set<unsigned int> celda::opciones() const {
	
	return _opciones;
	
}

celda& celda::operator=(const celda &otra){
	
	if (this == &otra)
		return *this;
	else
		_valor = otra.valor();
		_fija = otra.fija();
		_opciones= otra.opciones();
	

}
ostream& operator<<(ostream& os, const celda& c){

	if (c.valida())
		os << c.valor();
	else
		os << "_";

}
